package javafx179labs.sheypak.lab2;

import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.ext.swing.SwingTextField;
import javafx.ext.swing.SwingButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.Node;

//Text objects sequence, последовательность с объектами типа Text,
//которые вы динамически создаете
var textObjSeq : Text[] = [];

//пояснялочка
var textBoxTitle : Text = Text{
     layoutX: 20
     layoutY: 20
     content: "Введите текст для нового текстового объекта"
}

//для ввода текста, который будет в объекте Text
 var textBox : SwingTextField = SwingTextField{ 
    columns: 4
    layoutX: 20
    layoutY: 25
}

//Кнопочка
var button : SwingButton = SwingButton{
    layoutX: 85
    layoutY: 24
    text: "Создать новый объект типа Text"
    onMouseClicked:function(event : MouseEvent):Void{
        var title = textBox.text;
        if(title != null and title.trim().length() > 0){ //Если пользователь ввел не пустую строку, создать новый объект Text
            addNewText(title); //и поместить его в контент сцены (scene.content), чтобы отобразить  на экране, а так же в последовательность объектов Text
        }
    }
}

//Создает объект типа Text с текстом title, помещает созданный объект
//в контент сцены через bind (связанную) последовательность и в отдельную последовательность textObjSeq
function addNewText(title:String): Void{
    var yPos:Integer = 80 + 30*textObjSeq.size(); //Начиная с 80 пикселей, добавляем новый Text каждые 30 пикселей.
    var txt = Text{
        content: title
        layoutX: 20
        layoutY: yPos;
        onMouseClicked: function(event : MouseEvent){ //при клике на созданный объект Text, удалить его со сцены и из последовательности textObjSeq
            println("textObjSeq before deleting element {textObjSeq}");
            //event.node получаем объект, инициировавший событие onMouseClicked
            delete event.node as Text from textObjSeq; //приводим его к типу Text (потому что последовательность типа Text) и удаляем из последовательности
            delete event.node from sceneContent; //Приводить к типу не надо, сразу удаляем из контента сцены, т.к. посдеовательность типа Node и event.Node такого же типа.
            println("textObjSeq after deleting element {textObjSeq}");
        }
    }
    insert txt into textObjSeq;
    //insert txt into stage.scene.content; //Можно так
    insert txt into sceneContent; //А можно через bind. Любое изменение последовательности sceneContent будет отражено в поле content объекта scene
    
    println("sceneContent -> {sceneContent}");
    println("textObjSeq -> {textObjSeq}");
    println("Text with title'{title}' has been added.");
}

var sceneContent : Node[] = [textBox, textBoxTitle, button];

var stage : Stage = Stage {
    title: "Creating text"
    width: 400
    height: 400
    scene: Scene {
        content: bind sceneContent //связали с поледовательностью sceneContent, все измеения sceneContent будут отражены в content'e сцены.
    }
}